大数据 2022 年 1 月 23 日
图数据库与Nebula介绍
介绍图数据库的概念以及Nebula Graph的概念与使用
Nebula 基本介绍
疑问点:
-
后端通过什么方式写入?spark、flink
-
支持事务吗?不支持写入的事务,只有边存储的事务一致性
简介
什么是图数据库
图数据库是专门存储庞大的图形网络并从中检索信息的数据库。它可以将图中的数据高效存储为点(Vertex)和边(Edge),还可以将属性(Property)附加到点和边上。
什么是Nebula Graph
Nebula Graph 是一款开源的、分布式的、易扩展的原生图数据库,能够承载数千亿个点和数万亿条边的超大规模数据集,并且提供毫秒级查询。
基本概念
数据模型
图空间(Space): 相当于oracle的表空间
点(Vertex):实体对象,唯一标识符VID,至少有一个Tag
标签(Tag):描述点的预定义属性
属性(Properties):存储的键值对信息,点和边都可以添加
边(Edge):连接点,表示点之间的关系或行为(无限、有向、有类型、有rank)
边类型(Edge type):描述边的预定义属性
Nebula Graph 目前版本中允许存在”悬挂边”,因此在增删时,用户需自行保证“一条边所对应的起点和终点”的存在性。
运算符
管道符|: 组合查询
引用符
$^: 起始点
$$: 目的点
$-: 管道符之前的输出
schema函数
| 函数 | 说明 |
|---|---|
| id(vertex) | 返回点 ID。数据类型和点 ID 的类型保持一致。 |
| properties(vertex) | 返回点的所有属性。 |
| properties(edge) | 返回边的所有属性。 |
| type(edge) | 返回边的 Edge type。 |
| src(edge) | 返回边的起始点 ID。数据类型和点 ID 的类型保持一致。 |
| dst(edge) | 返回边的目的点 ID。数据类型和点 ID 的类型保持一致。 |
| rank(edge) | 返回边的 rank。 |
路径
walk:点和边都可以重复(go)
trail:点可以重复,边不能重复(match)
path:点和边都不可以重复
图模式
点:(a)
线:()-[b:serve]->()
tag:(a: player)
属性:(a: player{name: “james”})
长度:()-[*2..4]->()
nGQL
新增、修改、删除
图空间: create space basketball(vid_type=fixed_string(64))
Tag: create tag player(name string, age int);
drop tag player;
alter tag player add (salary double);
Edge Type: create edge follow(degree int);
drop edge follow;
alter edge follow(year int);
点: insert vertex player(name, age) values “player001”:(“james”, 25);
delete vertex “player001”;
update vertex on player “player001” set age = 35;
upsert vertex on player “player002” set name = “curry”, age = 32;
边: insert edge follow(degree) values “player001”->“player100”:(75);
delete edge follow “player001” -> “player100”;
update edge on follow” “player001” -> “player100” set degree = degree + 1;
upsert edge on follow” “player001” -> “player100” set degree = degree + 1;
修改是异步的,需要等待2个心跳周期才能确保生效
查询
match
根据模式进行匹配
MATCH [] RETURN ;
例:
MATCH (v:player) <-[]- (v2) WHERE id(v) == "player100" RETURN v2; lookup
遍历点或者边
例:
lookup on player where player.name == "james"; go
遍历图
例:
GO FROM "player100" OVER follow REVERSELY \
YIELD src(edge) AS id | \
GO FROM $-.id OVER serve \
WHERE $^.player.age > 20 \
YIELD properties($^).name AS FriendOf, properties($$).name AS Team; fetch
获取点或边的属性值
例:
fetch prop on player "player100" yield properties(vertex).name as name; 子句
group by
group by … yield …
支持的函数:avg(), sum(), max(), min(), count(), collect(), std();
例:
go from "player100" over follow yield properties($$).name as name | \
group by $-.name yield $-.name as player, count(*) as count; limit
与mysql基本一致
skip
从指定位置开始
sample
与GO中的step组合,表示每一步遍历时选择几条边进行遍历
GO 1 TO 3 STEPS FROM "player100" \
OVER * \
YIELD properties($$).name AS NAME, properties($$).age AS Age \
SAMPLE [1,2,3]; 第一跳遍历时,只选择1条边
第二跳遍历时,只选择2条边
第三跳遍历时,只选择3条边
order by
排序,必须在yield和管道符之后
return
返回结果
ttl
属性存活时间,到期后属性被删除
where
条件
yield
定义输出结果
Nebula Graph部署
下载
修改配置文件
nebula-grahd.conf、nebula-metad.conf、nebula-storaged.conf
将nebula-grahd.conf.default、nebula-metad.conf.default、nebula-storaged.conf.default文件修改为nebula-grahd.conf、nebula-metad.conf、nebula-storaged.conf
修改:
########## networking ##########
--meta_server_addrs=rabbitmq1:9559,rabbitmq2:9559
--local_ip=rabbitmq2 rabbitmq1中将local_ip修改为rabbitmq1
启动
授权
$ chmod -R 755 scripts
$ chmod -R 755 bin 启动服务
$ sh scripts/nebula.service start all
$ sh scripts/nebula.service status all 使用
连接控制台
[talkwebhzj@rabbitmq2 /]$ nebula-console -addr rabbitmq2 -port 9669 -u root -p 123 查询
(nebula) > USE basketballplayer;
(nebula) > GO FROM "player100" OVER follow; 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
作者: OnlyWaitY 发表日期:2022 年 1 月 23 日